import UIKit

// 对手列表窗口回调
protocol RivalWindowCallback: NSObjectProtocol {
    func onRivalWindowOK(_ selectedName: String)    // 用户单击"确定"按钮事件
}

// 对手列表窗口
public class RivalWindow: NSObject, UITableViewDelegate, UITableViewDataSource {
    private let mCallback: RivalWindowCallback      // 回调
    private var mData: NSMutableArray!              // 数据，即所有用户名
    private let mParentController: UIViewController // 视图控制者
    private var mTableViewUsers: UITableView!       // 列表控件
    private let mViewController: UIViewController   // 对话框控制者

    /**
     * 构造方法。
     * @param callback          回调
     * @param parentController  父视图控制者
     */
    init(_ callback: RivalWindowCallback, parentController: UIViewController) {
        // 初始化成员
        mCallback = callback
        mData = NSMutableArray()
        mParentController = parentController
        mTableViewUsers = UITableView(frame: CGRect.zero, style: .plain)
        mViewController = UIViewController()
        mViewController.modalPresentationStyle = .formSheet
        super.init()

        // 设置列表控件
        mTableViewUsers.dataSource = self
        mTableViewUsers.delegate = self
        mTableViewUsers.register(UITableViewCell.classForCoder(), forCellReuseIdentifier: "cell")
        mTableViewUsers.allowsSelection = true
        mTableViewUsers.separatorInset = .zero

        // 计算控件尺寸
        let screenWidth = UIScreen.main.bounds.width
        let screenHeight = UIScreen.main.bounds.height
        let padding = screenWidth * Const.SCALE_RIVAL_WINDOW_PADDING
        let width = screenWidth - padding * 2
        let maxHeight = screenHeight - padding * 2
        let cell = mTableViewUsers.dequeueReusableCell(withIdentifier: "cell", for: IndexPath(index: 0))
        let titleViewHeight = cell.frame.height * Const.SCALE_RIVAL_WINDOW_TITLE_VIEW_HEIGHT
        let sep1Height: CGFloat = 1
        let sep2Width: CGFloat = 1
        let btnHeight = cell.frame.height * Const.SCALE_RIVAL_WINDOW_BUTTON_HEIGHT
        var tableViewHeight = screenHeight * Const.SCALE_RIVAL_WINDOW_TABLE_VIEW_HEIGHT
        if titleViewHeight + sep1Height + tableViewHeight + btnHeight > maxHeight {
            tableViewHeight = maxHeight - titleViewHeight - sep1Height - btnHeight
        }

        // 创建标题视图
        var y: CGFloat = 0
        let titleView = UILabel(frame: CGRect(x: 0, y: y, width: width, height: titleViewHeight))
        titleView.backgroundColor = UIColor.white
        titleView.textColor = UIColor.blue
        titleView.font = UIFont.systemFont(ofSize: titleView.font.pointSize + 10)
        titleView.text = NSLocalizedString("IDS_RIVAL_LIST", tableName: "Main", comment: "")

        // 创建标题视图下面的分割线
        y = titleViewHeight
        let separator1 = UIView(frame: CGRect(x: 0, y: y, width: width, height: sep1Height))
        separator1.backgroundColor = UIColor.blue

        // 设置列表控件的尺寸和位置
        y += sep1Height
        mTableViewUsers.frame = CGRect(x: 0, y: y, width: width, height: tableViewHeight)

        /* 创建"取消"按钮 */
        y += tableViewHeight
        let btnWidth = (width - sep2Width) / 2
        let buttonCancel = UIButton(frame: CGRect(x: 0, y: y, width: btnWidth, height: btnHeight))
        buttonCancel.setTitle(NSLocalizedString("IDS_CANCEL", tableName: "Main", comment: ""), for: .normal)
        buttonCancel.setTitleColor(UIColor.black, for: .normal)
        buttonCancel.backgroundColor = UIColor.white
        buttonCancel.addTarget(self, action: #selector(onButtonCancelClicked), for: .touchUpInside)

        // 创建两按钮之间的分割线
        let separator2 = UIView(frame: CGRect(x: btnWidth, y: y, width: sep2Width, height: btnHeight))

        /* 创建"确定"按钮 */
        let buttonOK = UIButton(frame: CGRect(x: btnWidth + sep2Width, y: y, width: btnWidth, height: btnHeight))
        buttonOK.setTitle(NSLocalizedString("IDS_OK", tableName: "Main", comment: ""), for: .normal)
        buttonOK.setTitleColor(UIColor.black, for: .normal)
        buttonOK.backgroundColor = UIColor.white
        buttonOK.addTarget(self, action: #selector(onButtonOKClicked), for: .touchUpInside)

        // 将所有控件添加到窗口上
        let viewHeight = titleViewHeight + tableViewHeight + btnHeight
        y = (maxHeight - viewHeight) / 2 + padding / 3
        let subView = UIView(frame: CGRect(x: padding, y: y, width: width, height: viewHeight))
        subView.addSubview(titleView)
        subView.addSubview(separator1)
        subView.addSubview(mTableViewUsers)
        subView.addSubview(buttonCancel)
        subView.addSubview(separator2)
        subView.addSubview(buttonOK)
        mViewController.view.addSubview(subView)
    }
    
    /**
     * 隐藏。
     */
    public func hide() {
        mViewController.dismiss(animated: false)
    }

    /**
     * 获取 section 数量。
     * @return 总是 1
     */
    public func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    /**
     * "取消"按钮的单击响应方法。
     */
    @objc private func onButtonCancelClicked() {
        mViewController.dismiss(animated: false)
    }
    
    /**
     * "确定"按钮的单击响应方法。
     */
    @objc private func onButtonOKClicked() {
        if mTableViewUsers.indexPathForSelectedRow == nil {
            return
        }
        let selectedName = mData[mTableViewUsers.indexPathForSelectedRow!.row] as! String
        mCallback.onRivalWindowOK(selectedName)
        mViewController.dismiss(animated: false)
    }
    
    /**
     * 设置用户名列表。
     * @param usernameList  用户名列表
     */
    public func setUsernameList(_ usernameList: NSMutableArray?) {
        if usernameList != nil {
            mData = usernameList
            mTableViewUsers.reloadData()
        }
    }

    /**
     * 显示。
     */
    public func show() {
        mParentController.present(mViewController, animated: true)
    }

    /**
     * 获取列表行数。
     * @return 列表行数
     */
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return mData.count
    }

    /**
     * 获取列表控件上的一个 cell。
     * @param tableView 列表控件
     * @param indexPath cell 的索引，即第几个 cell
     * @return cell
     */
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for:indexPath)
        cell.textLabel!.text = mData[indexPath.row] as? String
        return cell
    }
}
